#pragma once

#include <string>
#include <nlohmann/json.hpp>

/**
 * @brief 配置管理类，使用单例模式
 * 
 * 该类负责管理服务器的所有配置信息，包括：
 * - 服务器设置（主机地址和端口）
 * - MySQL数据库连接设置
 * - Redis连接设置
 * 配置可以通过JSON文件加载，如果没有配置文件则使用默认值
 */
class Config {
public:
    /**
     * @brief 获取Config单例实例
     * @return Config& 配置类的单例引用
     */
    static Config& getInstance();

    /**
     * @brief 从JSON文件加载配置
     * @param configPath 配置文件路径
     */
    void load(const std::string& configPath);

    // Server settings
    /**
     * @brief 获取服务器监听端口
     * @return int 端口号
     */
    int getPort() const { return port_; }

    /**
     * @brief 获取服务器监听地址
     * @return const std::string& 主机地址
     */
    const std::string& getHost() const { return host_; }

    // Database settings
    /**
     * @brief 获取MySQL主机地址
     */
    const std::string& getMysqlHost() const { return mysqlHost_; }

    /**
     * @brief 获取MySQL端口号
     */
    int getMysqlPort() const { return mysqlPort_; }

    /**
     * @brief 获取MySQL用户名
     */
    const std::string& getMysqlUser() const { return mysqlUser_; }

    /**
     * @brief 获取MySQL密码
     */
    const std::string& getMysqlPassword() const { return mysqlPassword_; }

    /**
     * @brief 获取MySQL数据库名
     */
    const std::string& getMysqlDatabase() const { return mysqlDatabase_; }

    // Redis settings
    /**
     * @brief 获取Redis主机地址
     */
    const std::string& getRedisHost() const { return redisHost_; }

    /**
     * @brief 获取Redis端口号
     */
    int getRedisPort() const { return redisPort_; }

private:
    // 私有构造函数，防止外部实例化
    Config() = default;
    ~Config() = default;
    // 删除拷贝构造和赋值操作符，确保单例
    Config(const Config&) = delete;
    Config& operator=(const Config&) = delete;

    // 默认配置值
    std::string host_ = "0.0.0.0";        // 默认监听所有网络接口
    int port_ = 8080;                      // 默认WebSocket端口

    std::string mysqlHost_ = "localhost";  // 默认MySQL主机
    int mysqlPort_ = 3306;                 // 默认MySQL端口
    std::string mysqlUser_ = "app_user";   // 默认MySQL用户名
    std::string mysqlPassword_ = "Aa123456#"; // 默认MySQL密码
    std::string mysqlDatabase_ = "test_db";   // 默认数据库名

    std::string redisHost_ = "localhost";  // 默认Redis主机
    int redisPort_ = 6379;                 // 默认Redis端口
}; 